O módulo de busca, conforme apresentado anteriormente, é o responsável
pelo processo da busca do usuário, devolvendo as partidas mais pŕoximas das
partidas procuradas.

Diferentemente do Extrator, este módulo está mais próximo do usuário final,
existindo uma grande interação com o \emph{framework} Django para a obtećão da
entrada de busca e a exibição do resultado.

%(Inserir ilustração da arquitetura do buscador)

%(Inserir um diagrama de interação UML)

\subsection{Interface com usuário}

Com o servidor iniciado, o usuário poderá acessar a página inicial do sistema
com uma caixa de texto em um \emph{form} com o método \emph{post}.

\begin{figure}[htp]
\centering
\includegraphics[width=1.0\textwidth]{imagens/implementacao/pagina_busca.png}
\caption{Página inicial da busca}
\end{figure}

Este post chama uma ação `busca', que é reconhecida pelos \emph{URLs} do
servidor, chamando o método `busca' na classe \emph{views.py}, que é a
classe padrão do Django para tratar requisições \emph{HTTP}. Este método
instancia o agente reativo, alimentando-o com o conteúdo da caixa de texto preenchida pelo usuário.

\subsection{Agente reativo}

Ao ser instanciado, o agente tem como atributo a \emph{string} escrita pelo
usuário. Com base no princípio do reuso de código, o módulo de análise lexical é
reutilizado sobre essa entrada, sendo feitas as mesmas operaćões em um
texto jornalístico.


Por outro lado, a lista de resultados da análise lexical oferece algumas
complicações para as buscas. Com base nas premissas apresentadas, foi feita uma
simplificação, substituindo a classificação ``EQUIPE-CIDADE'' por ``EQUIPE'',
que ocorre pela ambiguidade apresentada por diversas equipes que têm como
nome a cidade de origem, como São Paulo, São Caetano, Rio Claro etc. O código
utilizado para fazer a simplificação é bem simples:

\begin{verbatim}
for i in range(len(lista)):
    if lista[i][1] == "EQUIPE-CIDADE":
        lista[i] = (lista[i][0], "EQUIPE")
return lista
\end{verbatim}

A lista simplificada é separada em listas de equipes, cidade e
estádio. A necessidade dessa separação é para a aplicaćão da lógica
do agente reativo. Ele simplesmente adiciona em uma nova lista cada \emph{token}
cujo tipo seja idêntico ao solicitado.

\begin{verbatim}
resultado = []
for i in lista:
    if i[1] == tipo:
        resultado.append(i[0])
return resultado
\end{verbatim}

Partindo da premissa que os usuários do sistema
entrarão com termos facilmente identificados, ou seja, dificilmente fugirão do
escopo de \emph{estádio}, \emph{equipe} ou \emph{cidade}; foram decididos
oito casos possíveis de busca do usuário:

\begin{itemize}
  \item Busca apenas por equipes;
  \item Busca apenas por estádios;
  \item Busca apenas por cidades;
  \item Busca por equipes e estádios;
  \item Busca por equipes e cidades;
  \item Busca por estádios e cidades;
  \item Busca pelos três tipos de termos;
  \item Busca inválida: nenhum termo foi reconhecido como válido.
\end{itemize}


Para o caso da busca inválida, o sistema retorna uma mensagem avisando o
usuário que devem ser colocados os termos \emph{equipes}, \emph{cidades} ou
\emph{estádios}.

Com relação às buscas válidas, o agente faz uso da API de acesso ao banco do
Django, buscando as partidas conforme as listas dos tipos de termos.
Para as buscas que envolvem equipes, havendo duas ou mais, é montada uma
lista com pares das equipes, para que sejam recuperadas partidas
do banco de dados que envolvam cada um desses pares de equipe. No caso de apenas
uma equipe ser detectada, são recuperadas todas as partidas que ela participa.

Quanto às buscas que envolvem estádios e cidades são recuperadas as partidas que cada estádio ou
cidade mencionados participa. O único ponto a ser mencionado é que, se o
estádio e cidade possuírem nomes iguais, os jogos que cumprirem esse critério
devem ser relacionados primeiro no resultado.

Caso a busca por um conjunto de equipes, estádios ou cidades haja um
pareamento dos times, busca-se as partidas que contenham os times e tenham
ocorrido nos estádios ou cidades solicitados. Caso não haja correspondência,
faz-se somente a busca por equipes.

O estudo da busca feita pelo usuário consiste em analisar as listas
resultantes da análise lexical, simplificação e separação. Verifica-se o
comprimento das listas separadas: caso sejam diferentes de zero, é um indicador
que aquele tipo foi solicitado pelo usuário. 
Para o melhor entendimento do texto anterior, é apresentado um
pseudocódigo no trecho a seguir:

%Tem algo para formatar para pseudo-código??
\begin{verbatim}
se (tamanho da lista de equipes != 0 e 
            o das listas de estádios e cidades == 0)
    buscar partidas por pares de equipes
senão
    se (tamanho da lista de estádios != 0 e 
            o das listas de equipes e cidades == 0)
        buscar partidas por estádio
senão
    se (tamanho da lista de cidades != 0 e 
            o das listas de equipes e estádios == 0)
        buscar partidas por cidades
senão
    se (tamanho da lista de equipes e estádios !=0 e 
            o da lista de cidades == 0)
        buscar partidas por pares de equipes e por estádios
senão
    se (tamanho da lista de equipes e cidades !=0 e 
            o da lista de estádios == 0)
        buscar partidas por pares de equipes e por cidades
senão
    se (tamanho da lista de estádios e cidades != 0 e 
           o da lista de equipes == 0)
        buscar partidas por estádios e cidades
senão
    se (tamanho da lista de equipes, estádios e cidades !=0)
        buscar partidas por equipes, estádios e cidades
senão
    emitir mensagem de busca inválida
\end{verbatim}

No caso de buscas que utilizam os três tipos distintos de termos, a
priorização dos resultados é feita da seguinte forma:
\begin{itemize}
  \item Partidas envolvendo as equipes solicitadas, no estádio que tenham o m
 esmo nome com cidade apresentada;
  \item Partidas envolvendo as equipes solicitadas, no estádio, independente da
  cidade;
  \item Partidas envolvendo as equipes solicitadas, independente do estádio e da
  cidade. 
\end{itemize}

A partir desta análise feita pelo agente são recuperadas partidas, ordenadas
conforme a explicaćao anterior. Esta lista ordenada de partidas é enviada para o
módulo de processamento para a construção da página de resultado.

\subsection{Módulo de processamento}
De posse da lista de partidas recuperadas pelo agente, o módulo de processamento
acessa cada item dela, montando uma página \emph{HTML} que
contém uma tabela indicando as datas, equipes, gols, público e renda do
estádio. Essa página é novamente enviada para a classe \emph{views.py}, que 
envia para o browser do usuário a página de resultado, ainda chama o
método `busca'.

A construção desta página começa pela construção das partes de \emph{Head} e
\emph{Title}, além do início da tabela, indicando os tipos de dados a serem
apresentados. A seguir, itera-se por cada item da lista, adicionando uma nova
linha na tabela, colocando os dados de partida de acordo com o que foi indicado
antes do comećo da iteraćão. Com o fim,
a tabela é fechada, adicionando-se um \emph{link} para voltar à pagina
inicial do mecanismo de busca.
